package com.itheima.d6_generics_class;

/**
 * 泛型类:
 * 注意：类型变量建议用大写的英文字母，常用的有：E、T、K、V 等
 * 修饰符 class 类名<类型变量，类型变量，…> {
 *
 * }
 * public class ArrayList<E>{
 *     . . .
 * }
 *接下来我们学习一下自定义泛型类，但是有一些话需要给大家提前交代一下：
 * 泛型类，在实际工作中一般都是源代码中写好，我们直接用的，就是ArrayList<E>这样的，自己定义泛型类是非常少的。
 *
 * 接下来，我们自己定义一个MyArrayList<E>泛型类，模拟一下自定义泛型类的使用。
 * 注意这里重点仅仅只是模拟泛型类的使用，所以方法中的一些逻辑是次要的，也不会写得太严谨。
 * //这里的<T,W>其实指的就是类型变量，可以是一个，也可以是多个。
 * public class 类名<T,W>{
 *
 * }
 * @param <E>
 */

public class MyArrayList<E> {

    //定义一个泛型类，用来表示一个容器
    //容器中存储的数据，它的类型用<E>先代替用着，等调用者来确认<E>的具体类型。
    //arraylist集合的里面是声明由一个object类型的数组来存放任意类型的数据，至于数组大小会扩大（以后教）
    private Object[] arr = new Object[10];
    private int size; // 记录object数组的当前位置


    //模拟arraylist里面的add方法
    public boolean add(E e){   //add方法能够添加的数据类型是由类型变量E决定的
        return true;
    }
    //模拟arraylist里面的get方法，根据索引查元素
    public E get(int index){    //根据索引查出来的元素类型（也就是get方法的返回类型），由类型变量E决定
        return null;
    }


    //完善上面的add和get方法功能
    public boolean add1(E e){
        //把收到的数据添加到object数组里面,size初始值为零
        arr[size++]=e;
        return true;
    }

    //注：这不是泛型方法，因为没有定义类型变量。因为这个E是泛型类声明给到get方法使用的，而不是get方法自己定义的
    public E get1(int index){
        //把根据索引获取到的object数组值返回，返回之前需要进行强转
        return (E) arr[index];
    }

}
